home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / interp / perl-5.003.tar.gz / perl-5.003.tar / perl-5.003 / minimod.pl < prev    next >
Perl Script  |  1996-01-22  |  3KB  |  138 lines

  1. # minimod.PL writes the contents of miniperlmain.c into the module
  2. # ExtUtils::Miniperl for later perusal (when the perl source is
  3. # deleted)
  4. #
  5. # It also writes the subroutine writemain(), which takes as its
  6. # arguments module names that shall be statically linked into perl.
  7. #
  8. # Authors: Andreas Koenig <k@franz.ww.TU-Berlin.DE>, Tim Bunce
  9. #          <Tim.Bunce@ig.co.uk>
  10. #
  11. # Version 1.0, Feb 2nd 1995 by Andreas Koenig
  12.  
  13. print <<'END';
  14. # This File keeps the contents of miniperlmain.c.
  15. #
  16. # It was generated automatically by minimod.PL from the contents
  17. # of miniperlmain.c. Don't edit this file!
  18. #
  19. #       ANY CHANGES MADE HERE WILL BE LOST! 
  20. #
  21.  
  22.  
  23. package ExtUtils::Miniperl;
  24. require Exporter;
  25. @ISA = qw(Exporter);
  26. @EXPORT = qw(&writemain);
  27.  
  28. $head= <<'EOF!HEAD';
  29. END
  30.  
  31. open MINI, "miniperlmain.c";
  32. while (<MINI>) {
  33.     last if /Do not delete this line--writemain depends on it/;
  34.     print;
  35. }
  36.  
  37. print <<'END';
  38. EOF!HEAD
  39. $tail=<<'EOF!TAIL';
  40. END
  41.  
  42. while (<MINI>) {
  43.     print;
  44. }
  45. close MINI;
  46.  
  47. print <<'END';
  48. EOF!TAIL
  49.  
  50. sub writemain{
  51.     my(@exts) = @_;
  52.  
  53.     my($pname);
  54.     my($dl) = canon('/','DynaLoader');
  55.     print $head;
  56.  
  57.     foreach $_ (@exts){
  58.     my($pname) = canon('/', $_);
  59.     my($mname, $cname);
  60.     ($mname = $pname) =~ s!/!::!g;
  61.     ($cname = $pname) =~ s!/!__!g;
  62.     print "EXTERN_C void boot_${cname} _((CV* cv));\n";
  63.     }
  64.  
  65.     my ($tail1,$tail2) = ( $tail =~ /\A(.*\n)(\s*\}.*)\Z/s );
  66.     print $tail1;
  67.  
  68.     print "    char *file = __FILE__;\n";
  69.     foreach $_ (@exts){
  70.     my($pname) = canon('/', $_);
  71.     my($mname, $cname, $ccode);
  72.     ($mname = $pname) =~ s!/!::!g;
  73.     ($cname = $pname) =~ s!/!__!g;
  74.     print "\t{\n";
  75.     if ($pname eq $dl){
  76.         # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
  77.         # boot_DynaLoader is called directly in DynaLoader.pm
  78.         $ccode = "\t/* DynaLoader is a special case */\n
  79. \tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
  80.         print $ccode unless $SEEN{$ccode}++;
  81.     } else {
  82.         $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
  83.         print $ccode unless $SEEN{$ccode}++;
  84.     }
  85.     print "\t}\n";
  86.     }
  87.     print $tail2;
  88. }
  89.  
  90. sub canon{
  91.     my($as, @ext) = @_;
  92.     foreach(@ext){
  93.         # might be X::Y or lib/auto/X/Y/Y.a
  94.         next if s!::!/!g;
  95.         s:^(lib|ext)/(auto/)?::;
  96.         s:/\w+\.\w+$::;
  97.     }
  98.     grep(s:/:$as:, @ext) if ($as ne '/');
  99.     @ext;
  100. }
  101.  
  102. 1;
  103. __END__
  104.  
  105. =head1 NAME
  106.  
  107. ExtUtils::Miniperl, writemain - write the C code for perlmain.c
  108.  
  109. =head1 SYNOPSIS
  110.  
  111. C<use ExtUtils::Miniperl;>
  112.  
  113. C<writemain(@directories);>
  114.  
  115. =head1 DESCRIPTION
  116.  
  117. This whole module is written when perl itself is built from a script
  118. called minimod.PL. In case you want to patch it, please patch
  119. minimod.PL in the perl distribution instead.
  120.  
  121. writemain() takes an argument list of directories containing archive
  122. libraries that relate to perl modules and should be linked into a new
  123. perl binary. It writes to STDOUT a corresponding perlmain.c file that
  124. is a plain C file containing all the bootstrap code to make the
  125. modules associated with the libraries available from within perl.
  126.  
  127. The typical usage is from within a Makefile generated by
  128. ExtUtils::MakeMaker. So under normal circumstances you won't have to
  129. deal with this module directly.
  130.  
  131. =head1 SEE ALSO
  132.  
  133. L<ExtUtils::MakeMaker>
  134.  
  135. =cut
  136.  
  137. END
  138.